perm filename MIXBUT[MIX,SYS] blob sn#020811 filedate 1972-02-29 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00005 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002		This section requests the user to "push a button" and
 00007 00003	QSTART:	SETZB	RJ, EXTIME			 EXTIME, RJ ← 0
 00011 00004	QSETUP:	SETZ	10,
 00014 00005	 RESCN routine to scan the rest of the line of TTY input looking an
 00016 ENDMK
⊗;
COMMENT	⊗	This section requests the user to "push a button" and
		then acts on that request.
	⊗

↓BUTTON:
	UPDATE
	SETZM	ERRORC
	OUTSTR	[ASCIZ ⊗
#⊗] 						; PROMPT FOR BUTTON
	MOVE	13, [POINT  7, 10]		; INITIALIZE BYTE POINTER
	INCHWL	11				; WAIT FOR LINE
	ANDI	11,177				;*RES* IGNORE CONTROL BITS
	CAIN	11,14				;*RES* IS THIS A FORM FEED
	JRST	QREWRT				;*RES* YES, REWRITE DD SCREEN
	cain	11, 175				; is it an <alt-mode>
	jrst	mixbug				; yes → go to the debugger
	SKIPA	10, [0]				; CLEAR 10 AND SKIP
BUT0:	INCHRW	11				; GE NEXT CHAR
	CAIL	11, "a"				; convert lower to upper
	CAILE	11, "z"
	SKIPA
	SUBI	11, 40
	CAIN	11,40				;*RES* IS IT A BLANK
	JRST	.+6				;*RES* YES
	CAIN	11, 15				; C-R → END OF BUTTON
	JRST	.+4
	IDPB	11, 13				; PUT CHAR INTO 10
	TLNE	13, 760000			; P=1 → 10 IS FULL
	JRST	BUT0
	MOVE	11, BLIST
	CAMN	10, BLIST(11)			; THIS BUTTON?
	JRST	.+3				; YES → GO TO THIS ADDRESS
	AOBJN	11, .-2				; NO → IF BUTTONS LEFT, TRY THEM
	JRST	BUT1				;*RES* TRY BUTTONS WITH ARGUMENTS
	INCHRW	10				; WAIT FOR L-F
	CAIE	10, 12
	JRST	.-2
	JRST	@ALIST(11)
BUT1:	MOVE	11,BLIST1			;*RES* GET POINTER TO BUTTON LIST
	CAMN	10,BLIST1(11)
	JRST	.+4				;*RES* A MATCH
	AOBJN	11,.-2
	OUTSTR	[ASCIZ /??/]			; FUNNY BUTTON
	JRST	BUTTON
	JRST	@ALIST1(11)

BLIST:	XWD	-ALIST+BLIST+1, 1
	0
	ASCII	⊗G⊗
	ASCII	⊗GO⊗
	ASCII	⊗S⊗
	ASCII	⊗START⊗
	ASCII	⊗L⊗
	ASCII	⊗LOAD⊗
	ASCII	⊗C⊗
	ASCII	⊗CONT⊗
	ASCII	⊗H⊗
	ASCII	⊗HALT⊗
	ASCII	⊗STEP⊗
	ASCII	⊗X⊗
	ASCII	⊗D⊗
	ASCII	⊗DISP⊗
	ASCII	⊗M⊗
	ASCII	⊗MEM⊗
	ASCII	⊗ZXT⊗
	ASCII	⊗ZPC⊗
	ASCII	⊗EXIT⊗
	ASCII	⊗READX⊗
	ASCII	⊗PNCHX⊗
	ASCII	⊗PRNTX⊗
	ASCII	⊗UPDAT⊗
	ASCII	⊗PCMLD⊗
	ASCII	⊗TRACX⊗
	ASCII	⊗NOEJE⊗		;*RES*
	ASCII	⊗EJECT⊗ 	;*RES*
	ASCII	⊗NEWS⊗		;*RES*
	ASCII	⊗ERRHA⊗		;*RES*
	ASCII	⊗ERRGO⊗		;*RES*
	ASCII	⊗MJH⊗
	ASCII	⊗DUM1⊗		;*RES* IN CASE NEEDED FOR PATCH
	ASCII	⊗DUM2⊗
ALIST:	0
	BUTTON+1
	QGO
	QGO
	QSTART
	QSTART
	QLOAD
	QLOAD
	QCONT
	QCONT
	QHALT
	QHALT
	QSTEP
	QSTEP
	QDISP
	QDISP
	QMEM
	QMEM
	QZXT
	QZPC
	QEXIT
	QREADX
	QPNCHX
	QPRNTX
	QUPDAT
	QPCMLD
	QRUNX
	QNOEJ			;*RES*
	QEJEC			;*RES*
	QNEW			;*RES*
	QERHLT			;*RES*
	QERRGO			;*RES*
	QMJH
	QDUM
	QDUM

BLIST1:	XWD	-ALIST1+BLIST1+1,1
	ASCII	⊗READ⊗
	ASCII	⊗PUNCH⊗
	ASCII	⊗PRINT⊗
	ASCII	⊗SETUP⊗
	ASCII	⊗MIXLO⊗
	ASCII	⊗MLD⊗
	ASCII	⊗TRACE⊗
	ASCII	⊗TK⊗
	ASCII	⊗SETPC⊗
	ASCII	⊗MIXAL⊗
	ASCII	⊗DUMP⊗
	ASCII	⊗DUM3⊗
	ASCII	⊗DUM4⊗
ALIST1:	0
	QREAD
	QPUNCH
	QPRINT
	QSETUP
	QMLD
	QMLD
	QRUN
	QRUNC
	QSETPC
	MIXAL
	QDUMP
	QDUM
	QDUM

QSTART:	SETZB	RJ, EXTIME			; EXTIME, RJ ← 0
	MOVEI	PC, MC0000			; PC ← MC0000
	JRST	MIXMN1

QGO:	MOVEI	INSTR, 2044			; THIS IS  "IN 0(16)"
	MOVEI	PC, MC0000			; SET PC TO ZERO
	JRST	MIXMN2				; NOW EXECUTE THE "IN"

QLOAD:	MOVEI	INSTR, 2044			; THIS IS  "IN 0(16)"
	TLO	FLAGS, SIFLAG			; SET THE SINGLE-INSTRUCTION FLAG
	JRST	MIXMN2				; NOW EXECUTE THE "IN"


QCONT:	JRST	MIXMN1				; GO RIGHT TO WORK

QHALT:	JRST	BUTTON				; ESSENTIALLY A NO-OP

QSTEP:	TLO	FLAGS, SIFLAG			; SET SIFLAG
	JRST	MIXMN1

QZXT:	SETZM	EXTIME				; EXTIME ← 0
	JRST	BUTTON

QZPC:	SETZ	RJ,				; RJ ← 0
	MOVEI	PC, MC0000			; PC ← MC0000
	JRST	BUTTON

QNOEJ:	SETOM	NOJECT				;*RES* WRITE OVER PERF ON
	JRST	BUTTON				;*RES*       LPT

QEJEC:	SETZM	NOJECT				;*RES*
	JRST	BUTTON				;*RES*
NOJECT:	0

QERHLT:	SETOM	ERRHLT				;*RES* HALT ON NON-FATAL ERRORS
	JRST	BUTTON

QERRGO:	SETOM	ERRHLT				;*RES* CONTINUE ON NON-FATAL ERRS
	JRST	BUTTON

QREWRT:	SKIPE	DDSW				;*RES* IS THIS A DATA DISK
	PUSHJ	P,REWRIT			;*RES* YES, REWRITE SCREEN
	JRST	BUTTON

QNEW:	PUSHJ	P,QNEWS				;*RES* WRITE OUT CURRENT NEWS
	JRST	BUTTON

QMJH:	SETOM	MJHSW#				;OCTAL DUMPS FOR JO
	JRST	BUTTON

QDUM:	JRST	BUTTON				;*RES* DUMMY SWITCHES ARE NO-OPS

QEXIT:	CALL	[SIXBIT  /EXIT/]		; SO LONG UNTIL TOMORROW

QMEM:	OUTSTR	[ASCIZ ⊗ADDRESS ⊗]
	INCHRW	11
	CAIN	11, "X"
	JRST	BUTTON
	ANDI	11, 17
	IMULI	11, =1000
	MOVE	10, 11
	INCHRW	11
	ANDI	11, 17
	IMULI	11, =100
	ADD	10, 11
	INCHRW	11
	ANDI	11, 17
	IMULI	11, =10
	ADD	10, 11
	INCHRW	11
	ANDI	11, 17
	ADD	10, 11
	OUTCHR	[":"]
	MOVE	10, MC0000(10)
	PUSHJ	P, PMIX
	JRST	QMEM

QDISP:	OUTSTR	[ASCIZ ⊗

DISPLAY:
⊗]
	OUTSTR	[ASCIZ ⊗  EXTIME=⊗]
	MOVE	10, EXTIME
	PUSHJ	P, OUTD1		;*RES*
	OUTSTR	[ASCIZ ⊗
  PC    =⊗]
	MOVEI	10,-MC0000(PC)		;*RES*
	PUSHJ	P, OUTD1		;*RES*
	OUTSTR	[ASCIZ ⊗
  RA    =⊗]
	MOVE	10, RA
	PUSHJ	P, PMIX
	OUTSTR	[ASCIZ ⊗  RX    =⊗]
	MOVE	10, RX
	PUSHJ	P, PMIX
	OUTSTR	[ASCIZ ⊗  RJ    =⊗]
	MOVE	10, RJ
	PUSHJ	P, OUTD1		;*RES*
	JRST	BUTTON

POCT:	MOVE	13, [POINT  3, 10]
	ILDB	11, 13
	ADDI	11, 60
	OUTCHR	11
	TLNE	13, 770000
	JRST	.-4
	OUTSTR	[ASCIZ ⊗
⊗]
	POPJ	P,

PMIX:	MOVEI	11, 53
	SKIPGE	10
	ADDI	11, 2
	OUTCHR	11
	MOVE	13, [POINT  3, 10, 5]
	OUTCHR	[" "]
	ILDB	11, 13
	ADDI	11, 60
	OUTCHR	11
	ILDB	11, 13
	ADDI	11, 60
	OUTCHR	11
	TLNE	13, 770000
	JRST	.-10
	OUTSTR	[ASCIZ ⊗
⊗]
	POPJ	P,

QSETUP:	SETZ	10,
	PUSHJ	P,RESCN			;*RES* LOOK FOR A SECOND ARG
	MOVE	11,RECHAR		;*RES* FOUND ONE
	JRST	.+5			;*RES* RESCN SKIPS 2 IF NO ARG
	OUTSTR	[ASCIZ /INSTRUCTIONS BETWEEN DISPLAY UPDATES: /]
	INCHWL	11
	SKIPA
	INCHRW	11
	CAIN	11, 15
	JRST	.+5
	ANDI	11, 17
	IMULI	10, =10
	ADD	10, 11
	JRST	.-6
	MOVEM	10, UPD0
	INCHRW	10
	CAIE	10, 12
	JRST	.-2
	JRST	BUTTON

QDUMP:	SKIPN	RUNC
	JRST	BUTTON
	PUSHJ	P,RANGE			;*RES* DETERMINE DUMP RANGE
	MOVE	11,BMASK		;*RES* DEFAULT IS BYTES
	CAIE	10,"/"			;*RES* IS A MODE SPECIFIED?
	JRST	QDMP1			;NO
	INCHWL	10
	CAIE	10,"I"			;INSTRUCTION MODE?
	JRST	.+3			;NO
	MOVE	11,IMASK
	JRST	QDMP1
	CAIE	10,"B"			;BYTE MODE?
	JRST	.+3			;NO
	MOVE	11,BMASK
	JRST	QDMP1
	CAIE	10,"D"			;DECIMAL MODE?
	JRST	.+3			;NO
	MOVE	11,DMASK
	JRST	QDMP1
	PUSHJ	P,MSPARS		;GET SPECIAL MASK
	MOVE	11,MASK
	CAIG	13,5			;IS MASK SIZE OKAY
	JRST	QDMP1			;YES
	OUTSTR	[ASCIZ /DUMP MASK IS MORE THAT 5 BYTES LONG
/]
	JRST	QBUTN
QDMP1:	MOVEM	11,DFALTM		;STORE DEFAULT MASK
	SKIPA
	INCHWL	10
	CAIE	10,12
	JRST	.-2
	JRST	DUMP			;GO TO THE DUMP

QSETPC:	PUSHJ	P,RESCN			;*RES* LOOK FOR A SECOND ARG
	MOVE	10,RECHAR		;*RES* FOUND ONE
	JRST	.+3			;*RES* RESCN SKIPS 2 IF NO ARG
	OUTSTR	[ASCIZ ⊗NEW VALUE FOR P.C. = ⊗]
	INCHWL	10
	SKIPA	11, [0]
QSPC1:	INCHRW	10
	CAIN	10, 15
	JRST	QSPC2
	IMULI	11, =10
	SUBI	10, 60
	ADD	11, 10
	JRST	QSPC1
QSPC2:	INCHRW	10
	ADDI	11, MC0000
	MOVE	PC, 11
	JRST	BUTTON

COMMENT ⊗ RESCN routine to scan the rest of the line of TTY input looking an
	argument.  Call is PUSHJ P,RESCN.  On return, the first character of
	the second argument is in location RECHAR and subsequent TTY inputs 
	will get the other characters.  If there is no second argument on the 
	line,the routine skips 2 instructions on return.
	⊗

RESCN:
	PUSH	P,10			;SAVE REGISTER
RESCN1:	INCHRW	10			;READ A CHAR
	CAIN	10,15
	JRST	RESCN2
	CAIN	10,12			;MAYBE A LF
	JRST	RESCN3			;YES, GET OUT OF HERE
	CAIN	10,40			;SKIP OVER ANY BLANKS
	JRST	RESCN1

;	We have read to a non-blank, non-CR character

	MOVEM	10,RECHAR		;SAVE THE CHARACTER
	POP	P,10
	POPJ	P,			;RETURN

;	We found a CR before finding a second argument

RESCN2:	INCHRW	10
	CAIE	10,12			;READ LF ALSO
	JRST	.-2
RESCN3:	MOVEI	10,2			;SET TO SKIP 2 ON RETURN
	ADDM	10,-1(P)
	POP	P,10			;RESTORE REGISTER
	POPJ	P,

RECHAR:	0